LLM 25일 코스 - Day 16: 프롬프트 엔지니어링

Day 16: 프롬프트 엔지니어링

같은 모델이라도 프롬프트를 어떻게 작성하느냐에 따라 결과 품질이 극적으로 달라집니다. 오늘은 핵심 프롬프트 기법과 실전 팁을 정리합니다.

역할 지정과 Zero-shot / Few-shot

from openai import OpenAI

client = OpenAI()  # 환경변수 OPENAI_API_KEY 필요

# Zero-shot: 예시 없이 바로 질문
response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[
        {"role": "system", "content": "당신은 감성 분석 전문가입니다. 긍정/부정/중립으로만 답하세요."},
        {"role": "user", "content": "이 제품 배송은 빨랐는데 품질이 별로예요."},
    ],
)
print("Zero-shot:", response.choices[0].message.content)

# Few-shot: 예시를 제공하여 패턴 학습 유도
response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[
        {"role": "system", "content": "감성을 분석하세요."},
        {"role": "user", "content": "음식이 맛있어요. -> 긍정\n서비스가 느려요. -> 부정\n그냥 평범해요. -> 중립\n\n이 제품 배송은 빨랐는데 품질이 별로예요. ->"},
    ],
)
print("Few-shot:", response.choices[0].message.content)

Chain-of-Thought (사고의 연쇄)

복잡한 추론 문제에서는 단계별 사고를 유도하면 정확도가 크게 향상됩니다. “단계별로 생각해보세요”라는 한 마디가 효과적입니다.

# 일반 프롬프트 vs CoT 프롬프트 비교
normal_prompt = "가게에 사과가 23개 있었다. 11개를 팔고 6개를 더 들여왔다. 남은 사과는?"

cot_prompt = """가게에 사과가 23개 있었다. 11개를 팔고 6개를 더 들여왔다. 남은 사과는?

단계별로 풀어보세요:
1단계: 처음 사과 개수를 확인합니다.
2단계: 판매한 만큼 뺍니다.
3단계: 새로 들여온 만큼 더합니다.
4단계: 최종 답을 구합니다."""

response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[{"role": "user", "content": cot_prompt}],
)
print(response.choices[0].message.content)

구조화 출력 (JSON 모드)

LLM 출력을 프로그래밍적으로 처리하려면 JSON 같은 구조화 형식이 필수입니다.

import json

response = client.chat.completions.create(
    model="gpt-4o-mini",
    response_format={"type": "json_object"},
    messages=[
        {"role": "system", "content": "JSON 형식으로만 응답하세요."},
        {"role": "user", "content": """다음 리뷰에서 정보를 추출하세요:
"삼성 갤럭시 S24를 2주간 사용했습니다. 카메라는 훌륭하지만 배터리가 아쉽습니다. 가격은 120만원이었어요."

형식: {"product": "", "duration": "", "pros": [], "cons": [], "price": ""}"""},
    ],
)
result = json.loads(response.choices[0].message.content)
print(json.dumps(result, ensure_ascii=False, indent=2))

프롬프트 팁 10가지

  1. 역할을 명확히 부여하세요 - “당신은 10년 경력의 데이터 사이언티스트입니다”
  2. 출력 형식을 지정하세요 - JSON, 표, 번호 리스트 등 원하는 형식을 명시
  3. 구분자를 사용하세요 - 입력과 지시를 ---이나 ###으로 분리
  4. 부정형보다 긍정형으로 - “~하지 마세요” 대신 “~하세요”
  5. 예시를 보여주세요 - Few-shot이 Zero-shot보다 거의 항상 좋음
  6. 단계를 나누세요 - 복잡한 작업은 “먼저… 그 다음… 마지막으로…”
  7. 제약 조건을 명시하세요 - “3문장 이내”, “200자 이하”
  8. 탈출 조건을 설정하세요 - “모르면 ‘모르겠습니다’라고 답하세요”
  9. 온도를 조절하세요 - 사실 기반은 낮게(0.10.3), 창작은 높게(0.71.0)
  10. 반복 실험하세요 - 한 번에 완벽한 프롬프트는 없음, 점진적으로 개선

오늘의 연습문제

  1. Few-shot 프롬프트로 한국어 뉴스 제목을 “정치/경제/사회/IT/스포츠” 5개 카테고리로 분류하는 시스템을 만들어보세요. 예시 5개를 포함하세요.
  2. Chain-of-Thought 기법을 사용하여 수학 문제(연립방정식)를 풀도록 프롬프트를 작성하고, CoT 없는 버전과 정답률을 비교해보세요.
  3. JSON 출력 모드를 활용하여 자유 형식의 이력서 텍스트에서 이름, 연락처, 학력, 경력을 구조화된 JSON으로 추출하는 프롬프트를 작성해보세요.

이 글이 도움이 되었나요?